package com.kyk.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.Map;
@Component
public class JwtUtil {
    /**
     * 签名用的密钥, 需要统一生成和管理密码
     */
    private static final String SIGNING_KEY = "123456789qqewrqerqerwqerw123456789qqewrqerqerwqerw123456789qqewrqerqerwqerw";
    /**
     * 用户登录成功后生成Jwt
     * 使用Hs256算法
     *
     * @param expMinutes jwt过期时间, 单位： 分钟
     * @param claims 保存在Payload（有效载荷）中的内容
     * @return token字符串
     */
    public static String createJWT(int expMinutes, Map<String,Object> claims) {
        //指定签名的时候使用的签名算法
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        //生成JWT的时间
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        Date exp = new Date(nowMillis + expMinutes * 1000 * 60);
        //创建一个JwtBuilder，设置jwt的body
        JwtBuilder builder = Jwts.builder()
                //保存在Payload（有效载荷）中的内容
                .setClaims(claims)
                //iat: jwt的签发时间
                .setIssuedAt(now)
                //设置过期时间
                .setExpiration(exp)
                //设置签名使用的签名算法和签名使用的秘钥
                .signWith(signatureAlgorithm, SIGNING_KEY);
        return builder.compact();
    }
    /**
     * 解析token，获取到Payload（有效载荷）中的内容，包括验证签名，判断是否过期
     */
    public static Claims parseJWT(String token) {
        //得到DefaultJwtParser
        Claims claims = Jwts.parser()
                //设置签名的秘钥
                .setSigningKey(SIGNING_KEY)
                .build()
                //设置需要解析的token
                .parseClaimsJws(token).getBody();
        return claims;
    }

    public static void main(String[] args) {

        Map map = Map.of("id", 1, "name", "yc");

        String jwt = createJWT(30, map);
        System.out.println("jwt = " + jwt);

        Claims claims = parseJWT(jwt);

        System.out.println("claims = " + claims);

        System.out.println("claims.get(\"id\") = " + claims.get("id"));
        System.out.println("claims.get(\"name\") = " + claims.get("name"));

    }


}